package com.cfp4cloud.cfp.knowledge.service.impl;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cfp4cloud.cfp.common.core.util.R;
import com.cfp4cloud.cfp.knowledge.entity.AiDataTableEntity;
import com.cfp4cloud.cfp.knowledge.mapper.AiDataTableMapper;
import com.cfp4cloud.cfp.knowledge.service.AiDataTableService;
import com.cfp4cloud.cfp.knowledge.support.feign.RemoteTableInfoService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * AI数据表管理服务实现类
 * <p>
 * 同步和管理多数据源的表元数据 支持自动发现和更新表结构信息 为AI SQL生成提供表结构基础数据
 *
 * @author cfp
 * @date 2025-03-26 21:48:16
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class AiDataTableServiceImpl extends ServiceImpl<AiDataTableMapper, AiDataTableEntity>
		implements AiDataTableService {

	/**
	 * 远程表信息服务 用于获取各数据源的表结构
	 */
	private final RemoteTableInfoService tableInfoService;

	/**
	 * 同步所有数据源的表信息
	 * <p>
	 * 自动发现系统中所有数据源 遍历每个数据源获取表列表 更新或新增表元数据记录
	 * @return 同步成功返回true
	 */
	@Override
	public boolean sync() {

		R<List<Map<String, Object>>> listDsR = tableInfoService.listDs();

		// 获取所有数据源名称
		List<String> dsNameList = new ArrayList<>(
				listDsR.getData().stream().map(datasourceMap -> MapUtil.getStr(datasourceMap, "name")).toList());

		// 添加默认主数据源
		dsNameList.add("master");

		for (String dsName : dsNameList) {

			try {
				// 获取数据源下的所有表
				List<Map<String, Object>> listTable = tableInfoService.listTable(dsName).getData();

				for (Map map : listTable) {
					String tableName = MapUtil.getStr(map, "name");
					String tableComment = MapUtil.getStr(map, "comment");
					AiDataTableEntity tableEntity = new AiDataTableEntity();
					tableEntity.setDsName(dsName);
					tableEntity.setTableName(tableName);
					tableEntity.setTableComment(tableComment);

					// 维护数据库类型
					String extend = MapUtil.getStr(map, "extend");
					if (StrUtil.isNotBlank(extend)) {
						tableEntity.setDsType(extend);
					}

					// 检查表是否已存在，存在则更新注释，不存在则新增
					this.getOneOpt(Wrappers.<AiDataTableEntity>lambdaQuery()
						.eq(AiDataTableEntity::getDsName, dsName)
						.eq(AiDataTableEntity::getTableName, tableName), false).ifPresentOrElse(entity -> {
							entity.setTableComment(tableComment);// 更新表注释
							baseMapper.updateById(entity);
						}, () -> baseMapper.insert(tableEntity));
				}

			}
			catch (Exception e) {
				log.warn("同步数据源 {} 数据表失败，系统跳过此数据源同步", dsName, e);
			}
		}

		return true;
	}

}
